8.3 Refactoring  
Mit Refactoring wird in Visual Studio 2005 erstmals eine Technik eingeführt, die bisher nur durch das Einbinden zusätzlicher Tools zu nutzen war. Refactoring ist hauptsächlich dann sinnvoll einzusetzen, wenn die Software bereits fertig ist. Sie können mit dieser Technik Änderungen am Code vornehmen, ohne dass sich das Verhalten der Anwendung ändert.
Sie werden mir beipflichten, dass während des Entwicklungsprozesses insbesondere größerer und komplexerer Software oft der Überblick über den Code verloren geht. Codepassagen wiederholen sich, Methoden werden zu komplex, weil der Modularisierung des Programmcodes zu wenig Aufmerksamkeit geschenkt wird, Variablennamen sind unpassend vergeben – typische Phänomene bei vielen Projekten. Mit der Technik des Refactorings können Sie dazu beitragen, dass der Code überschaubarer und klarer strukturiert wird. Dazu bieten sich mehrere Verfahren an:
|
Methode extrahieren |
|
Umbenennen von Bezeichnern |
|
Felder einkapseln |
|
Variablendeklaration und -initialisierung zusammenfassen |
|
Parameter neu anordnen |
Allerdings gehört dieses neue Feature, im Gegensatz zur Umgebung von C#, nicht zum Standard der VB-Entwicklungsumgebung und muss von der Microsoft-Website heruntergeladen werden. Die Adresse dazu lautet:
http://msdn.microsoft.com/vbasic/downloads/2005/tools/refactor
Die Größe der heruntergeladenen Datei beträft ca. 9 MByte. Die Installation ist benutzergeführt und nimmt nur wenige Minuten in Anspruch.
8.3.1 Methode extrahieren  
Der Sinn der Modularisierung ist es, viele kleine Methoden zu haben, die leichter zu überblicken und besser zu verstehen sind als lange und bildschirmfüllende. Der Methodenbezeichner sollte so gewählt werden, dass man sofort weiß, was die Aufgabe der Methode ist.
Gerät Ihnen bei der Entwicklung eine Methode »aus den Fugen« und wollen Sie einen Teilausschnitt in einer separaten Methode bereitstellen, würden Sie vermutlich die betreffenden Codezeilen suchen, markieren, ausschneiden und in einem neuen Methodenrumpf einfügen. Danach würden Sie anstelle der ausgeschnittenen Anweisungen den Aufruf der neuen Methode codieren.
Refactoring erleichtert Ihnen diese Arbeit. Dazu markieren Sie die Codezeilen, die in eine eigene Methode überführt werden sollen. Nach der Markierung wird links unten eine Drop-down-Schaltfläche angezeigt, die Sie anklicken müssen. Sie bekommen daraufhin als einzige Auswahl »Methode extrahieren« angeboten.
Als anschauliches Beispiel soll uns die folgende Methodendefinition dienen:
| Public Function TestProc() As Double
|
| Dim IntVar As Integer
|
| IntVar = 10
|
| Dim result As Double = Math.Pow(2, IntVar)
|
| Console.WriteLine("Das Ergebnis lautet: {0}", result)
|
| Return result
|
| End Function
|
In Abbildung 8.14 ist das Szenario des Auslagerns von Code zu erkennen.
 Hier klicken, um das Bild zu Vergrößern
Abbildung 8.14 Methode extrahieren
Bestätigen Sie das Extrahieren mit der (Enter)-Taste. Das Ergebnis ist danach wie folgt:
| Private Function GetResult(ByVal IntVar As Integer) As Double
|
| Dim result As Double = Math.Pow(2, IntVar)
|
| Console.WriteLine("Das Ergebnis lautet: {0}", result)
|
| Return result
|
| End Function
|
| Public Function TestProc() As Double
|
| Dim IntVar As Integer
|
| IntVar = 10
|
| Dim result As Double = GetResult(IntVar)
|
| Return result
|
| End Function
|
Die ausgeschnittenen Codezeilen werden durch den Aufruf der neuen Methode ersetzt. Möchten Sie den Bezeichner der neuen Methode Ihren eigenen Vorstellungen gemäß anpassen, markieren Sie den Bezeichner der neuen Methode, der danach farblich hinterlegt ist, und geben Sie den gewünschten Bezeichner an. Automatisch wird gleichzeitig auch der Methodenaufruf in der ursprünglichen Methode angepasst.
8.3.2 Umbenennen von Bezeichnern  
Der erste Schritt zu einem verständlichen und gut interpretierbaren Code ist eine Namensgebung, die bereits Rückschlüsse auf den Zweck und Einsatz des betreffenden Mitglieds zulässt. Eine Methode namens CreateDatabase verrät bereits sehr viel, TestProc hingegen gar nichts (auch wenn ich in diesem Buch oft genau diesen Bezeichner verwendet habe).
Zum Ende eines Projekts, wenn man den geschriebenen Code noch einmal durchsieht, fallen oft Bezeichner ins Auge, die möglicherweise besser gewählt worden wären. Früher hätten Sie wahrscheinlich darauf verzichtet, den unpassenden Bezeichner durch einen beschreibenderen zu ersetzen, denn im Anschluss daran hätten Sie den gesamten Code durchforsten müssen, um ihn an allen Stellen auszutauschen. Abgesehen davon, dass sich dabei Fehler durch Versäumnisse einschleichen können, die dafür benötigte Zeit kann anders investiert werden.
Auch für diese Fälle bietet das Refactoring durch Umbenennung jetzt die Lösung. Umbenannt werden können Felder, Eigenschaften, lokale Variablen, Methoden, Namespaces und Typdefinitionen. Der Umbenennungsprozess erfasst dabei nicht nur Deklarationen und Aufrufe, er ist zudem intelligent genug, alle Vorkommen des Elements zu erfassen.
Positionieren Sie den Cursor in dem betreffenden Bezeichner, öffnen Sie das Kontextmenü und klicken auf Umbenennen. Es öffnet sich ein Fenster, in dem Sie den neuen Namen eintragen. In Abbildung 8.15 sehen Sie das Fenster, wenn in TestProc die Variable intVar ausgewählt wird. Der neue Name ist noch nicht eingetragen.
 Hier klicken, um das Bild zu Vergrößern
Abbildung 8.15 Umbenennen eines Elements
8.3.3 Felder kapseln  
Nach den Paradigmen der Objektorientierung sollten alle Felder gekapselt werden. .NET-Anwendungen lösen das mit Hilfe von Eigenschaften, die einen Get- und einen Set-Accesor haben. Nicht immer werden sie sich an die objektorientierten Grundsätze halten, Sie müssen es auch nicht. Daher kann es vorkommen, dass Sie eine Variable Public definiert haben, aber zu einem späteren Zeitpunkt feststellen, dass die Kapselung in einer Eigenschaft unbedingt erforderlich ist.
Ein Feld zu kapseln ist das sehr schnell möglich, wenn Sie den Cursor in Bezeichner des betreffenden Feldes gesetzt haben. Öffnen Sie dann das Kontextmenü, und wählen Sie den Menüpunkt Refactor!. Eine öffentliche Felddeklaration mit Public wird automatisch zu einer Private-Deklaration. Der Bezeichner des Feldes bleibt unverändert, den der generierten Eigenschaftsmethode werden Sie aber noch besser wählen wollen. Da mit der Kapselung möglicherweise auch eine Änderung des Aufrufs der Eigenschaft im Programmcode verbunden ist, werden auch die Anweisungen an den Bezeichner der Eigenschaftsmethode angepasst.
Nach der Bestätigung der Kapselung des in Abbildung 8.16 gezeigten Codes sieht die Klassendefinition wie folgt aus:
| Public Class TestClass
|
| Private myName As String
|
| Public Property MyName1() As String
|
| Get
|
| Return myName
|
| End Get
|
| Set(ByVal value As String)
|
| myName = value
|
| End Set
|
| End Property
|
| Sub Test()
|
| MyName1 = 234
|
| End Sub
|
| End Class
|
 Hier klicken, um das Bild zu Vergrößern
Abbildung 8.16 Kapseln eines Feldes
Der Bezeichner der Eigenschaftsmethode wurde hierbei noch nicht manuell geändert.
8.3.4 Initialisierung und Deklaration zusammenführen oder trennen  
Eine von der Deklaration getrennte Initialisierung einer Variablen, wie beispielsweise
| Dim intVar As Integer
|
| intVar = 22
|
lässt sich mittels Refactor sehr einfach und schnell zusammenführen. Der Weg führt auch hier über das Kontextmenü und Refactor!, nachdem Sie den Cursor in eine der beiden Variablenbezeichner gesetzt haben. Das Resultat der Änderung ist die einzeilige Deklaration und Initialisierung:
| Dim intVar As Integer = 22
|
Den genau umgekehrten Weg können Sie natürlich auch beschreiten und eine zusammengefasste Initialisierungsdeklaration wieder trennen.
8.3.5 Neuanordnung der Parameterliste  
Als Letztes möchte ich Ihnen noch vorstellen, wie Sie mehrere Parameter einer Parameterliste neu anordnen können. Es ist nicht so, dass ich diese Möglichkeit als besonders wichtig einstufe, vielmehr wird die Anordnung recht eindrucksvoll im Code-Editor animiert. Alleine das ist schon das Ausprobieren wert.
Testen Sie das Feature an einer Methode ähnlich der folgenden:
| Public Function Addition(ByVal x As Long, ByVal y As Long) As Long
|
| Return x + y
|
| End Function
|
Wie zuvor führt auch hierbei der Weg über das Kontextmenü, nachdem Sie den Cursor auf einen der beiden Parameter gesetzt haben.
 Hier klicken, um das Bild zu Vergrößern
Abbildung 8.17 Neuanordnung der Parameter einer Parameterliste
Mit den Steuerungstasten können Sie nun den ausgewählten Parameter verschieben. Das Eindrucksvolle dabei ist, dass die Verschiebung auch visualisiert worden ist, was natürlich durch eine einfache Abbildung überhaupt nicht wiedergegeben werden kann.
|